package bean;

import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.Date;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.servlet.http.HttpServletRequest;

import org.richfaces.component.UISelect;

import DAO.HospitalizacaoDAO;
import DAO.LaboratorioDAO;
import DAO.PacienteDAO;
import Model.Hospitalizacao;
import Model.Laboratorio;
import Model.Paciente;
import Utils.Uteis;

public class HospitalizacaoBean {	
	private int id;
	private String nomeHospital;
	private Date dataInternacao;
	private Date dataAlta;
	private String observacao;
	private int idPaciente;
	
	private UISelect idPacienteValidation;
	private UIInput dataAltaValidation;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getNomeHospital() {
		return nomeHospital;
	}
	public void setNomeHospital(String nomeHospital) {
		this.nomeHospital = nomeHospital;
	}
	public Date getDataInternacao() {
		return dataInternacao;
	}
	public void setDataInternacao(Date dataInternacao) {
		this.dataInternacao = dataInternacao;
	}
	public Date getDataAlta() {
		return dataAlta;
	}
	public void setDataAlta(Date dataAlta) {
		this.dataAlta = dataAlta;
	}
	public String getObservacao() {
		return observacao;
	}
	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}
	public int getIdPaciente() {
		return idPaciente;
	}
	public void setIdPaciente(int idPaciente) {
		this.idPaciente = idPaciente;
	}
	
	public UISelect getIdPacienteValidation() {
		return idPacienteValidation;
	}
	public void setIdPacienteValidation(UISelect idPacienteValidation) {
		this.idPacienteValidation = idPacienteValidation;
	}
	
	public UIInput getDataAltaValidation() {
		return dataAltaValidation;
	}
	public void setDataAltaValidation(UIInput dataAltaValidation) {
		this.dataAltaValidation = dataAltaValidation;
	}
	
	public String Salvar()
	{
		try {
			Hospitalizacao objHosp = new Hospitalizacao();
			objHosp.setIdPaciente(this.idPaciente);
			objHosp.setNomeHospital(this.nomeHospital);
			objHosp.setDataInternacao(Uteis.javaDate2SqlDate(this.dataInternacao));
			
			if(this.dataAlta != null)
				objHosp.setDataAlta(Uteis.javaDate2SqlDate(this.dataAlta));
			
			
			objHosp.setObservacao(this.observacao);
			if(this.id > 0)
			{
				objHosp.setIdHospitalizacao(this.id);
				HospitalizacaoDAO.Update(objHosp);
			}
			else
				HospitalizacaoDAO.Insert(objHosp);
			
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("sucesso", new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso!", "Informações Salvas com sucesso"));	
			
		}
		catch (ParseException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("erro", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Ocorreu um problema ao salvar as informações, contate o administrador do sistema"));
		}
		catch (SQLException  ex)
		{
			// TODO Auto-generated catch block
			ex.printStackTrace();
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("erro", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Ocorreu um problema ao salvar as informações, contate o administrador do sistema"));
		}
		
		return "hospitalizacao_list";
	}
	
	public String Inativar()
	{
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
		int id = Integer.parseInt(request.getParameter("idhospitalizacao"));		
		try
		{			
			HospitalizacaoDAO.inativarHospitalizacao(id);
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("sucesso", new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso!", "Informações inativadas com sucesso"));
		}
		catch(SQLException sqlex)		
		{
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("erro", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Ocorreu um problema ao inativar as informações, contate o administrador do sistema"));
		}	
		return "hospitalizacao_list";
	}
	
	public String Editar()
	{
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
		int id = Integer.parseInt(request.getParameter("idhospitalizacao"));
		Hospitalizacao hospitalizacao = null;
		try
		{
			hospitalizacao = HospitalizacaoDAO.LoadObject(id);
			this.setId(hospitalizacao.getIdHospitalizacao());
			this.setNomeHospital(hospitalizacao.getNomeHospital());
			this.setDataAlta(hospitalizacao.getDataAlta());
			this.setDataInternacao(hospitalizacao.getDataInternacao());
			this.setObservacao(hospitalizacao.getObservacao());
			this.setIdPaciente(hospitalizacao.getIdPaciente());
			return "hospitalizacao_edit"; 			
		}
		catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return "hospitalizacao_list";
		}	

	}
	
	public void validateData(FacesContext context, UIComponent uicomponent, Object value)
	{
		Date dataSel = (Date) value;
		try {
			if(dataSel != null)
			{
				if(dataSel.after(new Date()))
				{
					((UIInput)uicomponent).setValid(false);
					FacesMessage message = new FacesMessage();
					message.setDetail("A data não pode estar no futuro!");        	
					message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
					throw new ValidatorException(message);
				}	
				else
				{											
					Object objDataAlta = dataAltaValidation.getSubmittedValue();
					
					if(objDataAlta != null && objDataAlta != "")
					{
						Date dataalta = Uteis.string2UtilDate(objDataAlta.toString());
						if(dataalta.before(dataSel))
						{
							((UIInput)uicomponent).setValid(false);
							FacesMessage message = new FacesMessage();
							message.setDetail("A data de internação não pode ser maior que a data de alta!");        	
							message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
							throw new ValidatorException(message);
						}
					}	
						
					Object idPacienteSelect = this.idPacienteValidation.getLocalValue();	
					if(idPacienteSelect != null)
					{
						int idPaciente = Integer.parseInt(this.idPacienteValidation.getLocalValue().toString());
						Paciente paciente = PacienteDAO.LoadObject(idPaciente);
						if(dataSel.before(paciente.getDataNascimento()))
						{
							String data = Uteis.formatarData(paciente.getDataNascimento());
							((UIInput)uicomponent).setValid(false);
							FacesMessage message = new FacesMessage();					
							message.setDetail("A data não pode ser menor que "+ data +" que é data de nascimento do paciente! ");
							message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
							throw new ValidatorException(message);
						}						
					}
					else
					{
						((UIInput)uicomponent).setValid(false);
					}					
				}	
			}			
			
		} catch (SQLException e) {
			e.printStackTrace();
		}catch (ParseException e) {
			e.printStackTrace();
		}
	}


}
